Hi!
Hier ein kleines Beispiel für den DLI.
Normal hast Du z.B. eine Displaylist für Textmodus 0 die wie folgt aussieht:
StartDspl .BYTE $70, $70, $70 ; Drei leere Zeilen
.BYTE $42,
.BYTE $02, $02, $02, $02, $02
.BYTE $02, $02, $02, $02, $02
.BYTE $02, $02, $02, $02, $02
.BYTE $02, $02, $02 ; 24 Zeilen Gr. 0 insgesamt
.BYTE $41,
Um den Antic mitzuteilen, wo er einen Interrupt durchführen soll, muss das Bit 7 (+ $80) gesetzt werden. Also z.B. :
StartDspl .BYTE $70, $70, $70 ; Drei leere Zeilen
.BYTE $42,
.BYTE $02, $02, $02, $02, $02
.BYTE $82, $02, $02, $02, $02 ; In Zeile 12 im Textmode einen Interrupt starten
.BYTE $02, $02, $02, $02, $02
.BYTE $02, $02, $02 ; 24 Zeilen Gr. 0 insgesamt
.BYTE $41,
Nun muss der Antic noch wissen, wo Dein Programm steht:
JSR WaitVSync ; Auf jedem Fall den Interruptvektor
; Im VBI setzen, damit der Computer
; nicht abstürzt
LDA #<DLIStart ; DLI-Programm in den Adresse VDSLST
STA VDSLST ; und VDSLST+1 ablegen.
LDA #>DLIStart
STA VDSLST+1
LDA #NMIEN_DLI | NMIEN_VBI ; Neben dem VBI soll nun auch der DLI
STA NMIEN ; berücksichtigt werden
Das Programm selbst muss dringend alle Register sichern und den Binärmodus setzen und zum Schluss die Register wiederherstellen:
DLIStart PHA ; Akku auf den Stack sichern TXA PHA ; X Register auf den Stack sichern TYA PHA ; Y Register auf den Stack sichern
CLD ; Binärmodus aktivieren
JSR TitelMusik.MUSPLAY
JSR xSFX.ENGINE
PLA ; Y Register wiederherstellen
TAY
PLA ; X Register wiederherstellen
TAX
PLA ; Akku wiederherstellen
RTI ; Return from Interrupt
Die Musik sollte man bevor man den DLI einrichtet schon einmal Initialisieren:
LDA #$05
STA TitelMusik.MUMAXDELAY ; Musikgeschwindigkeit
LDA #$02 ; Anzahl der genutzen Kanäle
STA TitelMusik.MUKANALCNT+1
LDA #$01
STA TitelMusik.MUWAHL ; Musik-Set wählen
JSR TitelMusik.MUSINI ; und Player initialisieren
und kann anschließend jederzeit die Musik so auch ändern.